// 给定一个正整数 n ，输出外观数列的第 n 项。

// 「外观数列」是一个整数序列，从数字 1 开始，序列中的每一项都是对前一项的描述。

// 你可以将其视作是由递归公式定义的数字字符串序列：

// countAndSay(1) = "1"
// countAndSay(n) 是对 countAndSay(n-1) 的描述，然后转换成另一个数字字符串。

// 1.     1
// 2.     11
// 3.     21
// 4.     1211
// 5.     111221
// 第一项是数字 1 
// 描述前一项，这个数是 1 即 “ 一 个 1 ”，记作 "11"
// 描述前一项，这个数是 11 即 “ 二 个 1 ” ，记作 "21"
// 描述前一项，这个数是 21 即 “ 一 个 2 + 一 个 1 ” ，记作 "1211"
// 描述前一项，这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ，记作 "111221"

// 要 描述 一个数字字符串，首先要将字符串分割为 最小 数量的组，
// 每个组都由连续的最多 相同字符 组成。然后对于每个组，
// 先描述字符的数量，然后描述字符，形成一个描述组。
// 要将描述转换为数字字符串，先将每组中的字符数量用数字替换，再将所有描述组连接起来。

/**
 * @param {number} n
 * @return {string}
 */
var countAndSay = function (n) {
  var index = 1
  var str = '1'

  function say(str) {
    var returnArr = []
    for (var i = str.length; i > 0;) {
      var j = 0
      returnArr.unshift(str[i - 1])
      while ((i - j) > 0 && str[i - 1] == str[i - 1 - j]) {
        j++
      }
      returnArr.unshift(j + '')
      i -= j
    }
    return returnArr.join('')
  }
  while (index < n) {
    str = say(str)
    index++
  }
  return str
};

console.log(countAndSay(6))

function fn(n) {
  if (n == 1) return 1
  return fn(n - 1) + n
}


// 没想出来递归的写法 感觉可以使用递归

//递归 + 双指针
// 解析
var countAndSay = function (n) {
  if (n === 1) {
    return "1";
  };
  let pre = countAndSay(n - 1);
  let result = "",
    left = 0,
    right = 0;
  while (right < pre.length) {
    while (pre[left] === pre[right] && right < pre.length) {
      right++;
    };
    result += (right - left).toString() + pre[left];
    left = right;
  }
  return result;
};